/*
 * Copyright (c)  2015~2020, xforceplus
 * All rights reserved.
 * Project:datacare-orm
 * Id: CrudSqlManager.java   2020-10-10 23-31-45
 * Author: Evan
 */
package cn.datacare.orm.manager;

import cn.datacare.orm.damoin.RowMapper;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * Title:
 * </p>
 * <p>
 * Description:
 * </p>
 * <p>
 * Copyright: 2015~2020
 * </p>
 * <p>
 * Company/Department: xforceplus
 * </p>
 *
 * @author Evan
 * <b>Creation Time:</b> 2020-10-10 23-31-45
 * @since V1.0
 */
public interface SelectSqlManager {

    /**
     * 将查询结果返回成Long类型
     * @param id
     * @param params
     * @return
     */
    Long longValue(String id, Map<String, Object> params);

    /**
     * 将查询结果返回成Long类型
     * @param id
     * @param params
     * @return Long
     */
    Long longValue(String id, Object params);

    /**
     * 将查询结果返回成Integer类型
     *
     * @param id
     * @param params
     * @return
     */
    Integer intValue(String id, Object params);

    /**
     * 将查询结果返回成Integer类型
     *
     * @param id
     * @param params
     * @return Integer
     */
    Integer intValue(String id, Map<String, Object> params);

    /**
     * 将查询结果返回成BigDecimal类型
     *
     * @param id
     * @param params
     * @return BigDecimal
     */
    BigDecimal bigDecimalValue(String id, Object params);


    /**
     * 将查询结果返回成BigDecimal类型
     *
     * @param id
     * @param params
     * @return
     */
    BigDecimal bigDecimalValue(String id, Map<String, Object> params);

    /**
     * 通过sqlId进行查询,查询结果映射到clazz上
     *
     * @param sqlId  sql标记
     * @param clazz  需要映射的Pojo类,可以是实体类，也可以是一个Map
     * @param params 参数集合
     * @return Pojo集合
     */
      <T> List<T> select(String sqlId, Class<T> clazz, Map<String, Object> params);

    /**
     * 通过sqlId进行查询,查询结果映射到clazz上，mapper类可以定制映射
     *
     * @param sqlId  sql标记
     * @param clazz  需要映射的Pojo类,可以是实体类，也可以是一个Map
     * @param paras  参数集合
     * @param mapper 自定义结果映射方式
     * @return
     */
    <T> List<T> select(String sqlId, Class<T> clazz, Map<String, Object> paras, RowMapper<T> mapper);

    /**
     *
     * @param sqlId
     * @param clazz
     * @param params
     * @param <T>
     * @return
     */
    <T> List<T> select(String sqlId, Class<T> clazz, Object params);

    /**
     * 根据sqlId查询目标对象
     *
     * @param sqlId
     * @param clazz
     * @return
     */
    <T> List<T> select(String sqlId, Class<T> clazz);

    /**
     * 单个对象
     * @param targetClass
     * @param value
     * @return
     */
      Object single(Class targetClass, Object value);


    /**
     * 根据主键查询 获取唯一记录，如果纪录不存在，将会抛出异常
     *
     * @param clazz
     * @param pk    主键
     * @return
     */
    <T> T unique(Class<T> clazz, Object pk);

    /**
     * 根据主键查询,获取唯一记录，如果纪录不存在，将会抛出异常
     *
     * @param clazz
     * @param mapper 自定义结果映射方式
     * @param pk     主键
     * @return
     */
    <T> T unique(Class<T> clazz, RowMapper<T> mapper, Object pk);
}
